(function($){

    /*
     * email, url, 参考validatebox源文件, lenght, remote 见官网
     **/
    $.extend($.fn.validatebox.defaults.rules, {

        /*       ------------- 数字验证 -------------       */
        // 正整数
        posInteger: {
            validator: function(value, param) {
                if (!/^([0-9]+)$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入大于0的整数。'
        },
        negInteger: {
            validator: function(value, param) {
                if (!/^-([0-9]+)$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入小于0的整数。'
        },
        // 整数值，正整数和负整数
        integer: {
            validator: function(value, param) {
                if (!/^-?[0-9]*[1-9]*$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入整数。'
        },
        // 浮点数
        float: {
            validator: function(value, param) {
                if (!(/^(-?\d+)(\.\d+)?$/.test(value))) {
                    return false;
                }
                return true;
            },
            message: '请输入浮点数。'
        },
        // 数字整数和浮点数
        number: {
            validator: function(value, param) {
                if (!/^-?(0|[1-9]\d*)(\.\d*)?$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入数字。'
        },
        //整数 范围
        intRange:{
            validator: function(value, param) {
                if (!/^-?\d+$/.test(value) || value < param[0] || value > param[1] ) {
                    return false;
                }
                return true;
            },
            message: '请输入{0}-{1}之间的整数。'
        },
        // 浮点数精度验证
        floatPrecision: {
            validator: function(value, param) {
                if(value == undefined || value == "") {
                    return true;
                }
                if(isNaN(value)) {
                    return false;
                }
                var val = $.trim(value);
                var val1 = val;
                var val2 = "";
                //小数点位置
                var idx = val.indexOf(".");
                if(idx != -1) {
                    val1 = val.substr(0, idx);
                    val2 = val.substr(idx + 1, val.length - idx - 1);
                }
                //整数部分
                if(val1.length > (param[0] - param[1]) || val2.length > param[1]) {
                    return false;
                } 
                return true;
            },
            message: "浮点数值的精度小于{0}位且小数位数小于{1}位。"
        },
        floatPositive : {
            validator: function(value, param){ 
                if(value == undefined || value == ""){
                    return true;
                }
                if(isNaN(value)){
                    return false;
                }
                var val = $.trim(value);
                var val1 = val;
                var val2 = "";
                //小数点位置
                var idx = val.indexOf(".");
                if(idx != -1) {
                    val1 = val.substr(0, idx);
                    val2 = val.substr(idx+1, val.length - idx - 1);
                }
                //整数部分
                if(val1.length > (param[0] - param[1]) || val2.length > param[1]) {
                    return false;
                }
                if(Number(value) <= 0) {
                    return false;
                }
                return true;
            },
            message: "请确保输入的数值长度小于{0}位，小数位数小于{1}位且大于0."
        },

        /*       ------------- 字符验证 -------------       */
        // 字母
        alpha: {
            validator: function(value, param) {
                if (!/^([a-zA-Z]+)$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入字母。'
        },
        // 字母数字
        alphanum: {
            validator: function(value, param) {
                if (!/^([a-zA-Z0-9]+)$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入数字或字母(大小写).'
        },
        // 特殊字符和非空
        specialCharacters: {
            validator: function(value, param) {
                if($.trim(value).length == 0) {
                    return false;
                }
                if (/([~!@#$%&*()`=+,.;?<>-]|\\|\/|\'|\")/.test(value)) {
                    return false;
                }
                if(value.length <= param[0]) {
                    return true;
                }
            },
            message: '不为空，亦不能有特殊字符且长度不超过{0}个。'
        },
        // 汉字验证
        chinese: {
            validator: function(value, param) {
                if(value == undefined || $.trim(value) == ""){
                    return false;
                }
                if (/([~!@#$%&*()`=+,.;?<>-]|\\|\/|\'|\")/.test(value)) {
                    return false;
                }
                if($.trim(value).replace(/[^\x00-\xff]/g, "**").length > param[0]*2) {
                    return false;
                }
                return true;
            },
            message: '请确保输入的内容在{0}个汉字以内且不能有特殊字符。'
        },
        // 字符长度
        alphaLength: {
            validator: function(value, param) {
                if(value == undefined || value == "") {
                    return true;
                }
                if($.trim(value).replace(/[^\x00-\xff]/g, "**").length > param[0]) {
                    return false;
                }
                return true;
            },
            message: '请确保输入的内容在{0}个字符以内。'
        },
        // null NULL 字符串
        isNotNullChar: {
            validator: function(value, param) {
                var s = $.trim(value);
                if (s.toLowerCase() === "null") {
                    return false;
                }
                return true;
            },
            message: '不能为单独的null字符(不区分大小写)'
        },
        // 身份证验证
        idCard : {
            msg: "", 
            validator: function (value, param) {
                 var addr = {
                             11:"北京", 12:"天津", 13:"河北", 14:"山西", 15:"内蒙古", 21:"辽宁", 22:"吉林", 23:"黑龙江 ",
                             31:"上海", 32:"江苏", 33:"浙江", 34:"安徽", 35:"福建", 36:"江西", 37:"山东", 41:"河南", 42:"湖北 ",
                             43:"湖南", 44:"广东", 45:"广西", 46:"海南", 50:"重庆", 51:"四川", 52:"贵州", 53:"云南", 54:"西藏 ",
                             61:"陕西", 62:"甘肃", 63:"青海", 64:"宁夏", 65:"新疆", 71:"台湾", 81:"香港", 82:"澳门", 91:"国外 "};
                 var tip = "";

                 if(!value || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(value)) {
                     this.msg = "身份证号格式错误";
                     return false;
                 } else if(!addr[value.substr(0, 2)]) {
                     this.msg = "地址编码错误";
                     return false;
                 } else {
                     // 校验位
                     if(value.length == 18) {
                         value = value.split('');
                         var weightTables = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                         //校验位
                         var crc = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
                         var sum = 0, bit = 0, weight = 0;
                         for (var i = 0; i < 17; i++) {
                             bit = value[i];
                             weight = weightTables[i];
                             sum += bit * weight;
                         }
                         var last = crc[sum % 11];
                         if(crc[sum % 11] != value[17]) {
                             this.msg = "校验位错误";
                             return false;
                         }
                     }
                 }
                 return true;
             },
             message: "身份证号码不正确。"
        },

        /*       ------------- 常用验证 -------------       */
        // 验证IP地址
        checkIp : {
            validator : function(value) {
                var reg = /^((1?\d?\d|(2([0-4]\d|5[0-5])))\.){3}(1?\d?\d|(2([0-4]\d|5[0-5])))$/;
                return reg.test(value);
            },
            message : 'IP地址格式不正确'
        },
        // 验证端口号
        port: {
            validator: function(value, param) {
                if(!$.isNumeric(value) || value < 0 && value > 65535) {
                    return false
                }
                return true;
            },
            message: "请输入合理的端口号。"
        },
        // 电子邮件
        email: {
            validator: function(value, param) {
                if (!/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入正确的邮箱格式。'
        },
        // 手机
        mobile:{
            validator: function(value, param) {
                if (!/^1[3|4|5|7|8][0-9]\d{4,8}$/.test(value)) {
                    return false;
                }
                return true;
            },
            message: '请输入正确的手机号。'
        },
        // 固定电话
        telphone: {
            validator: function(value, param) {
                if (!/((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/.test(value)) {
                    return false;
                }
                return true;
            }, 
            message: '请输入正确的电话号码。'
        },
        // 邮编
        zipCode: {
            validator: function (value) {
                var reg = /^[0-9]\d{5}$/;
                return reg.test(value);
            },
            message: '请输入正确的邮政编码。'
        },
        //最大字符数
        maxLength: {
            validator: function(value, param) {
                if (typeof value !== "string") {
                    value += "";
                }
                return param[0] >= value.replace(/[^\x00-\xff]/g,"01").length;
            },
            message: '请输入最大{0}位字符，其中汉字占2个字符。'
        },
        //税号验证
        taxSubjectNum :{
            validator : function(value) {
                var reg = /^[A-Z0-9]{15,20}$/;
                return reg.test(value);
            },
            message : '税号长度为15到20位数字或英文(大写).'
        },
        //银行号码
        bankNumber : {
            validator : function(value){
                var reg = /^\d{16,19}$/;
                return reg.test(value);
            },
            message : '银行账户16到19位数字'
        },

        /*       ------------- 组件相关 -------------       */
        /*
         * <input id="pwd" name="pwd" data-options="required:true">
         * <input id="pwd2" name="rpwd" class="easyui-validatebox" validType="equals['#pwd']">
         */
        // 验证两个输入字段是否相等
        equals: {
            validator: function(value, param) {
                return value == $(param[0]).val();
            },
            message: '字段不匹配'
        },
        // 下拉列表选择
        isSelect: {
            validator: function(value, param) {
                if(value == -1 || value == "") {
                    return false;
                }
                return true;
            },
            message: '请选择'
        },
        //combobox必输项 传入id值
        comboxRequired: {
            validator: function(value, param) {
                return $("#"+param[0]).combobox("getValue") != null && $("#"+param[0]).combobox("getValue") != '';
            },
            message: '该选择项为必选项'
        }



    });
})(jQuery);